package com.platform.utils;

import org.apache.log4j.Logger;
import org.springframework.util.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 日期处理
 *
 * @author lipengjun
 * @email 939961241@qq.com
 * @date 2016年12月21日 下午12:53:33
 */
public class DateUtils {
    public static final String CHINA_DATE_FORMAT = "yyyy年MM月dd日";
    public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_FORMAT = "yyyy-MM-dd";
    public static final String TIME_FORMAT = "HH:mm:ss";
    // 日志
    private static final Logger logger = Logger.getLogger(DateUtils.class);

    /**
     * 时间格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * 无分隔符日期格式 "yyyyMMddHHmmssSSS"
     */
    public static String DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS = "yyyyMMddHHmmssSSS";
    /**
     * 时间格式(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    // 日期转换格式数组
    public static String[][] regularExp = new String[][]{

            // 默认格式
            {"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))\\s+([0,1]\\d|[2][0-3]|\\d):([0-5]\\d|\\d):([0-5]\\d|\\d)",
                    DATE_TIME_PATTERN},
            // 仅日期格式 年月日
            {"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))",
                    DATE_PATTERN},
            //  带毫秒格式
            {"\\d{4}((([0][1,3-9]|[1][0-2]|[1-9])([0-2]\\d|[3][0,1]|[1-9]))|((02|2)(([1-9])|[0-2]\\d)))([0,1]\\d|[2][0-3])([0-5]\\d|\\d)([0-5]\\d|\\d)\\d{1,3}",
                    DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS}
    };

    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }

    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }

    public static String timeToStr(Long time, String pattern) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        if (time.toString().length() < 13) {
            time = time * 1000L;
        }
        Date date = new Date(time);
        String value = dateFormat.format(date);
        return value;
    }

    public static long strToTime(String timeStr) {
        Date time = strToDate(timeStr);
        return time.getTime() / 1000;
    }


    /**
     * 转换为时间类型格式
     *
     * @param strDate 日期
     * @return
     */
    public static Date strToDate(String strDate) {
        try {
            String strType = getDateFormat(strDate);
            SimpleDateFormat sf = new SimpleDateFormat(strType);
            return new Date((sf.parse(strDate).getTime()));
        } catch (Exception e) {
            return null;
        }
    }


    /**
     * 根据传入的日期格式字符串，获取日期的格式
     *
     * @return 秒
     */
    public static String getDateFormat(String date_str) {
        String style = null;
        if (StringUtils.isEmpty(date_str)) {
            return null;
        }
        boolean b = false;
        for (int i = 0; i < regularExp.length; i++) {
            b = date_str.matches(regularExp[i][0]);
            if (b) {
                style = regularExp[i][1];
            }
        }
        if (StringUtils.isEmpty(style)) {
            logger.info("date_str:" + date_str);
            logger.info("日期格式获取出错，未识别的日期格式");
        }
        return style;
    }

    /**
     * 将字符串类型的转换成Date类型
     *
     * @param dateStr
     *            字符串类型的日期 yyyy-MM-dd
     * @return Date类型的日期
     * @throws ParseException
     */
    public static Date convertStringToDate(String dateStr) {
        // 返回的日期
        Date resultDate = null;
        try {
            // 日期格式转换
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            resultDate = sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return resultDate;
    }

    /**
      * 比较日期(年月日,时分秒)
      *
      * @param dateStr1
      * @param dateStr2
      * @return
      */
    public static int compareDateTime(String dateStr1, String dateStr2) {
        Date date1 = parseDateTime(dateStr1);
        Date date2 = parseDateTime(dateStr2);
        if (date1.getTime() > date2.getTime())
            return -1;
        else if (date1.getTime() < date2.getTime())
            return 1;
        else
            return 0;
    }

    /**
      * 比较日期
      *
      * @param dateStr1
      * @param dateStr2
      * @return
      */
    public static int compareDate(String dateStr1, String dateStr2) {
        Date date1 = parseDate(dateStr1);
        Date date2 = parseDate(dateStr2);
        if (date1.getTime() > date2.getTime())
        return -1;
        else if (date1.getTime() < date2.getTime())
        return 1;
        else
        return 0;
    }
        public static int compareDate(Date date1, Date date2) {
        if (date1.getTime() > date2.getTime())
        return -1;
        else if (date1.getTime() < date2.getTime())
        return 1;
        else
        return 0;
        }
    /**
     *两个日期比较得到分钟
     * date1:开始时间 dateB:结束时间
    */
    public static long getMinute(Date date1,Date date2){
        long diff = 0;
        try {
            SimpleDateFormat df = new SimpleDateFormat(DATE_TIME_PATTERN);
            long dateA = df.parse(df.format(date1)).getTime();
            //从对象中拿到时间
            long dateB = df.parse(df.format(date2)).getTime();
             diff=(dateB-dateA)/1000/60/60;
        }catch (Exception e){
            logger.error("两个日期比较得到分钟报错");
            e.printStackTrace();
        }
        return diff;
    }
    /*
    * 新增天数 返回date类型
    * */
    public static Date plusDay(int num)  {
        try {
            Calendar calendar = new GregorianCalendar();  // 定义calendar对象

            calendar.setTime(new Date()); // 把当前系统时间赋值给calendar
            calendar.add(calendar.DATE, num); // 在日期中增加天数,1天
            Date date = calendar.getTime(); // 把calendar转换回日期格式
            return date;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /*
     *  在指定日期加小时 返回Date
     * */
    public static Date addHour(Date date1,int hour)  {
        try {
            //在某一个时间点上加两小时的写法
            Calendar calendar = Calendar.getInstance();
        //此处setTime为Date类型
            calendar.setTime(date1);
        //加上两小时
            calendar.add(Calendar.HOUR, hour);//时
        //进行时间格式化
            SimpleDateFormat s = new SimpleDateFormat(DATETIME_FORMAT);

            Date date = s.parse(s.format(calendar.getTime()));
            return date;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 格式化字符串为日期
     *
     * @param date
     * @param format
     * @return
     */
    public static Date parseDate(String date, String format) {
        try {
            return new SimpleDateFormat(format).parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Date parseDate(String date) { return parseDate(date, DATE_FORMAT);}
    public static Date parseChinaDate(String date) {
        return parseDate(date, CHINA_DATE_FORMAT);
    }
    public static Date parseDateTime(String date) {
        return parseDate(date, DATETIME_FORMAT);
    }
    public static Date parseTime(String date) {
        return parseDate(date, TIME_FORMAT);
    }

    public static void main(String[] args) throws ParseException {
        System.out.println(DateUtils.format(new Date(),"yyyy-MM-dd"));
    }
}
